/*
 * @Author: fisher
 * @Date: 2024-02-05 22:22:43
 * @LastEditors: fisher luthor-li@qq.com
 * @LastEditTime: 2024-03-27 11:14:25
 * @FilePath: \pscluster\index.js
 * @Description:
 */
require('dotenv').config({
  path:
    process.env.NODE_ENV === 'production'
      ? '.env.production'
      : '.env.development'
})
const Koa = require('koa')
const jwt = require('koa-jwt')
const secret = process.env.JWT_SECRET // 应由环境变量提供
const fs = require('fs')
const path = require('path')
// const serve = require('koa-static')
// const mount = require('koa-mount')
const Router = require('koa-router')
const bodyParser = require('koa-bodyparser')
const errorHandler = require('./middlewares/errorHandler')
const HttpError = require('./utils/httpError')
// const cors = require('@koa/cors')
const loggingMiddleware = require('./middlewares/loggingMiddleware') // 确保路径匹配您的项目结构
const clusterService = require('./services/clusterService')
const app = new Koa()

// // 跨域配置
// app.use(
//   cors({
//     origin: 'http://localhost:5173'
//   })
// )
// 使用日志中间件
app.use(loggingMiddleware)
// 使用错误处理中间件
global.HttpError = HttpError
app.use(errorHandler)
// 使用bodyparser中间件
app.use(bodyParser())
// JWT 错误处理
app.use(async (ctx, next) => {
  return next().catch(err => {
    if (401 == err.status) {
      throw new HttpError('未登录!', 401)
    } else {
      // // 可以在这里添加更多错误处理逻辑，比如记录日志等
      throw err
    }
  })
})
// 添加用于 JWT 验证的中间件
// unless 部分用于指定某些路径或者模式不需要验证 JWT
app.use(
  jwt({ secret }).unless({
    path: [
      // /^\/static/,
      /^\/Auth\/login/,
      /^\/Auth\/register/,
      /^\/ueinstance\/msgBySignal/
    ]
  })
)
// const staticDirPath = path.join(__dirname, 'public')
// // 给静态文件服务设置前缀 '/static'
// app.use(mount('/static', serve(staticDirPath)))

// 创建一个新的总路由器来统一子路由器
const routerAll = new Router()
// 读取路由目录并自动注册每个路由模块
const routesPath = path.join(__dirname, 'routes')
fs.readdirSync(routesPath).forEach(file => {
  // 忽略文件夹和非JS文件
  if (
    fs.statSync(path.join(routesPath, file)).isFile() &&
    file.endsWith('.js')
  ) {
    // 导入路由模块
    const route = require(path.join(routesPath, file))
    // 使用路由模块的basename作为前缀
    const routePrefix = path.basename(file, '.js')
    routerAll.use(`/${routePrefix}`, route.routes(), route.allowedMethods())
  }
})
// 使用总路由器中间件
app.use(routerAll.routes()).use(routerAll.allowedMethods())
const PORT = process.env.PORT || 3000
app.listen(PORT, () => {
  console.log(`Server listening on port ${PORT}`)
})

clusterService.registerCluster()
